﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Threading;
using System.Windows.Forms;
using BGCOP.CAVTOP.BUSINESSLAYER;
using BGCOP.CAVTOP.INNERDEFS;
using Telerik.WinControls.UI;

namespace BGCOP.CAVTOP.WINFORMS
{
    public partial class frmInnerRuntime : Form
    {
        private List<Inner> vectorInners = new List<Inner>();
        private bool _termino = false;
        private int _innerActual = 0;
        private bool salir = false;
        private int qtyB = 14;
        byte Origem = 0;
        byte Complemento = 0;
        StringBuilder Cartao = new StringBuilder();
        byte Dia = 0;
        byte Mes = 0;
        byte Ano = 0;
        byte Hora = 0;
        byte Minuto = 0;
        byte Segundo = 0;
        string strCartao = string.Empty;
        private Thread molinete1;
        Bilhete evento;

        #region utilidades
        public void changeProgress()
        {
            
        }
        public void AppendTextBox(TextBox txtB, string value)
        {
            if (_termino)
            {
                return;
            }
            if (txtB.InvokeRequired)
            {
                this.Invoke(new Action<TextBox, string>(AppendTextBox), new object[] { txtB, value });
                return;
            }
            else
            {
                txtB.AppendText("[" + DateTime.Now + "]\r\n " + value + "\r\n");
                txtB.ScrollToCaret();

            }

        }
        public void changeIconTree(RadTreeView rt,int nodeIndex, int ic )
        {
            if (_termino)
            {
                return;
            }
            if (rt.InvokeRequired)
            {
                try
                {
                    this.Invoke(new Action<RadTreeView, int, int>(changeIconTree), new object[] { rt, nodeIndex, ic });
                }
                catch (Exception)
                {
                    
                    
                }
                
                return;
            }
            else
            {

                rfRadtre();
                //radTreeView1.Nodes.Refresh();
                Application.DoEvents();
            }
        }
        public void rfRadtre()
        {
            int i = 0;
            
            foreach (var d in vectorInners)
            {
                if (d.isOnline == true)
                {
                    d.nombre2 = d.nombre + " En línea";
                    radTreeView1.Nodes[i].ImageIndex = 1;
                }
                else
                {
                    if (d.isActive == true)
                    {
                        d.nombre2 = d.nombre + " fuera de línea";    
                    }
                    else
                    {
                        d.nombre2 = d.nombre + " *Inactivo!*";
                    }
                    
                    radTreeView1.Nodes[i].ImageIndex = 0;
                    
                }
                i++;
            }
        }

        #endregion

        public frmInnerRuntime()
        {
            InitializeComponent();
        }

        
        private void frmInnerRuntime_Load(object sender, EventArgs e)
        {
            tmrInicio.Enabled = true;
        }
        /// <summary>
        /// atencion del hilo para los inners
        /// </summary>
        public void ProcesoInners()
        {
            int Res=0;
            TimeSpan t3= new TimeSpan();
            EasyInner.DefinirTipoConexao((byte)Enumeradores.TipoConexao.TCP_IP_COM_PORTA_FIXA);
            EasyInner.FecharPortaComunicacao();

            Res = EasyInner.AbrirPortaComunicacao(3570);
            Thread.Sleep(500);
            if (Res != (int)Enumeradores.Retorno.RET_COMANDO_OK)
            {
                AppendTextBox(textBox1, "Comunicacion con el puerto [3570] ERROR!");
                return;
            }
            Res = EasyInner.Ping(1);
            Res = EasyInner.Ping(1);
           
            Res = EasyInner.Ping(1);
            Res = EasyInner.Ping(1);
            Res = EasyInner.Ping(1);
            TareasInner tareaIn = new TareasInner();
            AppendTextBox(textBox1, "Comunicacion con el puerto Exitosa!");
            while (!_termino)
            {
                //primero se selecciona hasta encontrar el primer inner activo
                
                switch (vectorInners[_innerActual].Estado)
                {
                    case 1:
                        #region [1. Examina Ping Online de cada Inner ]
                        //AppendTextBox(textBox1, "Buscando Dispositivo " +
                        //    vectorInners[_innerActual].Numero.ToString(CultureInfo.InvariantCulture) + "...");
                        Res = EasyInner.Ping(vectorInners[_innerActual].Numero);
                        Thread.Sleep(10);
                        if(Res == (int)Enumeradores.Retorno.RET_COMANDO_OK)
                        {
                            vectorInners[_innerActual].Estado = 2;
                            vectorInners[_innerActual].isOnline = true;
                            changeIconTree(radTreeView1, _innerActual, 1);
                            
                        }
                        else
                        {
                            vectorInners[_innerActual].Estado = 1;
                            vectorInners[_innerActual].isOnline = false;
                            changeIconTree(radTreeView1, _innerActual, 0);
                            
                            
                        }
                        
                        #endregion
                        break;
                    case 2:
                        #region [1. Conf Offline de cada Inner ]
                        EasyInner.ConfigurarInnerOffLine();
                        Thread.Sleep(3);
                        EasyInner.DefinirQuantidadeDigitosCartao((byte)qtyB);
                        Thread.Sleep(3);
                        Res=EasyInner.DefinirMensagemEntradaOffLine(1, "Entrada OK");
                        Thread.Sleep(3);
                        Res=EasyInner.DefinirMensagemSaidaOffLine( 1, "Saida OK");
                        Thread.Sleep(3);
                        Res=EasyInner.DefinirMensagemPadraoOffLine( 1, "*Fuera de Linea*");
                        Thread.Sleep(3);
                        if (vectorInners[_innerActual].isInnerNet == true)
                        {
                            EasyInner.ConfigurarAcionamento2((byte)Enumeradores.FuncaoAcionamento.ACIONA_REGISTRO_ENTRADA_OU_SAIDA, 4);
                            
                        }
                        else
                        {
                            EasyInner.ConfigurarAcionamento2((byte)Enumeradores.FuncaoAcionamento.NAO_UTILIZADO, 3);
                        }
                        Res = EasyInner.EnviarMensagensOffLine(vectorInners[_innerActual].Numero);
                        EasyInner.ConfigurarTipoLeitor(2);
                        EasyInner.ReceberDataHoraDadosOnLine(1);
                        EasyInner.ConfigurarLeitor1((byte)Enumeradores.Operacao.ENTRADA_E_SAIDA);
                        EasyInner.ConfigurarLeitor2((byte)Enumeradores.Operacao.ENTRADA_E_SAIDA);
                        EasyInner.ConfigurarAcionamento1((byte)Enumeradores.FuncaoAcionamento.CATRACA_LIBERADA_DOIS_SENTIDOS_MARCACAO_REGISTRO,5);
                        //EasyInner.ConfigurarAcionamento2((byte)Enumeradores.FuncaoAcionamento.ACIONA_REGISTRO_ENTRADA_OU_SAIDA, 7);
                        Res = EasyInner.DefinirTipoListaAcesso(0);
                        Res = EasyInner.DefinirFuncaoDefaultLeitoresProximidade(12);
                        //Thread.Sleep(100);
                        Res = EasyInner.EnviarConfiguracoes((byte)vectorInners[_innerActual].Numero);
                        if (Res == (int)Enumeradores.Retorno.RET_COMANDO_OK)
                        {
                            AppendTextBox(textBox1, "Ajuste Inner offline OK " );
                            vectorInners[_innerActual].Estado = 3;
                        }
                        else
                        {
                            AppendTextBox(textBox1, "Error en Ajuste Inner offline");
                            vectorInners[_innerActual].CountFails += 1;
                            if (vectorInners[_innerActual].CountFails > 5)
                            {
                                //vuele a estado de reconexion

                                vectorInners[_innerActual].Estado = 1;
                                break;
                            }
                        }

                        //Res = EasyInner.ApagarHorariosAcesso(vectorInners[_innerActual].Numero);
                        //for (int d = 1; d <= 7; d++)//laço para preencher os 5 dias,1 a 5 (segunda a sexta)
                        //{
                        //    //                                   Horario1,DIA    ,Faixa 1 , Horário  
                        //    Res = EasyInner.InserirHorarioAcesso((byte) 1, (byte) d, (byte) 1, (byte) 5, 0);
                        //    //                                   Horario1,DIA    ,Faixa 1 , Horário  
                        //    Res = EasyInner.InserirHorarioAcesso((byte) 1, (byte) d, (byte) (2), (byte) 23, 0);
                        //}

                        //Res = EasyInner.EnviarHorariosAcesso((byte)vectorInners[_innerActual].Numero);
                        //if (Res == (int)Enumeradores.Retorno.RET_COMANDO_OK)
                        //{
                        //    AppendTextBox(textBox1, "Enviados Horarios de Acceso");
                        //}
                        //else
                        //{
                        //    AppendTextBox(textBox1, "Error en Enviados Horarios de Acceso");
                        //    vectorInners[_innerActual].CountFails++;
                        //    if (vectorInners[_innerActual].CountFails > 5)
                        //    {
                        //        //vuele a estado de reconexion

                        //        vectorInners[_innerActual].Estado = 1;
                        //        break;
                        //    }
                        //}

                        ////Início do envio da lista de horários 

                        //Res = EasyInner.ApagarListaAcesso((byte)vectorInners[_innerActual].Numero);

                        ////Thread.Sleep(80);
                        ////                                   Cartão       , Horário 1
                        //Res = EasyInner.InserirUsuarioListaAcesso("64692351783", (byte)1);
                        ////                                   Cartão       , Horário 1
                        //Res = EasyInner.InserirUsuarioListaAcesso("64692351784", (byte)1);
                        ////                                   Cartão       , Horário 1
                        //Res = EasyInner.InserirUsuarioListaAcesso("64692351785", (byte)1);
                        ////                                   Cartão      , Horário 100 acesso sempre negado
                        //Res = EasyInner.InserirUsuarioListaAcesso("64692351782", (byte)100);
                        ////                                   Cartão      , Horário 100 acesso sempre negado
                        //Res = EasyInner.InserirUsuarioListaAcesso("222222222222", (byte)101);

                        //Res = EasyInner.EnviarListaAcesso((byte)vectorInners[_innerActual].Numero);
                        //if (Res == (int)Enumeradores.Retorno.RET_COMANDO_OK)
                        //{
                        //    AppendTextBox(textBox1, "Enviada Lista de Acceso");
                        //    vectorInners[_innerActual].Estado = 3;
                        //}
                        //else
                        //{
                        //    AppendTextBox(textBox1, "Error en Enviar Lista de Acceso");
                        //    vectorInners[_innerActual].CountFails++;
                        //    if (vectorInners[_innerActual].CountFails > 5)
                        //    {
                        //        //vuele a estado de reconexion
                        //        vectorInners[_innerActual].Estado = 1;
                        //        break;
                        //    }
                        //}

                        #endregion
                        break;
                    case 3:
                        #region 3. Eventos del inner
                        AppendTextBox(textBox1, "Inner: " + _innerActual.ToString() + " Verificando Eventos en Inner");
                        //Thread.Sleep(350);
                        evento = new Bilhete();
                        evento.Ano = 0;
                        evento.Cartao = null;
                        evento.Cartao = new StringBuilder();
                        evento.Dia = 0;
                        evento.Hora = 0;
                        evento.Mes = 0;
                        evento.Minuto = 0;
                        evento.Tipo = 0;

                        Res = EasyInner.ColetarBilhete(vectorInners[_innerActual].Numero, 
                            ref evento.Tipo, ref evento.Dia, ref evento.Mes, ref evento.Ano,
                                                   ref evento.Hora, ref evento.Minuto, evento.Cartao);
                        if (Res == (int)Enumeradores.Retorno.RET_COMANDO_OK)
                        {
                            AppendTextBox(textBox1,
                                          "Inner: " + _innerActual.ToString() + " evento : " + evento.Cartao.ToString());
                            if (VerificaTarjeta(evento.Cartao.ToString()) == true)
                            {
                                PersisteMarcacion(evento.Cartao.ToString(),
                                                  vectorInners[_innerActual].Numero.ToString(
                                                      CultureInfo.InvariantCulture));
                            }
                        }
                        else
                        {
                            //fin de los evnetos
                            AppendTextBox(textBox1, "Inner: " + 
                                vectorInners[_innerActual].Numero.ToString(CultureInfo.InvariantCulture) + 
                                " Fin de eventos del Inner");
                            vectorInners[_innerActual].Estado = 4;
                            //Termino = true;
                        }
                        #endregion
                        break;
                    case 4:
                        #region Cambio automatico
                        //AppendTextBoxL(toolStripStatusLabel4, "Habilitar cambio automatico!");
                        //5 segundo para pasar a condicion offline desde online
                        EasyInner.HabilitarMudancaOnLineOffLine((byte)Enumeradores.MudancaOnlineOffline.SEM_PING_ONLINE, 3);

                        //EasyInner.DefinirEntradasMudancaOffLine((byte)Enumeradores.Opcao.SIM,//Teclado
                        //                                        (byte)Enumeradores.Opcao.SIM,//Leitor1
                        //                                        (byte)Enumeradores.Opcao.NAO,//Leitor2
                        //                                        (byte)Enumeradores.Opcao.SIM//Verificação
                        //                                        );//Identificação
                        EasyInner.DefinirMensagemPadraoMudancaOffLine((byte)Enumeradores.Opcao.SIM, "*Fuera de Linea*");
                        EasyInner.DefinirMensagemPadraoMudancaOnLine((byte)Enumeradores.Opcao.SIM, "   *En Linea*   ");
                        EasyInner.DefinirEntradasMudancaOnLine(7);
                        Res = EasyInner.EnviarConfiguracoesMudancaAutomaticaOnLineOffLine(vectorInners[_innerActual].Numero);
                        if (Res == (int)Enumeradores.Retorno.RET_COMANDO_OK)
                        {
                            AppendTextBox(textBox1, "Inner: " + vectorInners[_innerActual].Numero.ToString(CultureInfo.InvariantCulture) + " Conf Automatica on-off OK");
                            vectorInners[_innerActual].Estado = 5;
                        }
                        else
                        {
                            AppendTextBox(textBox1, "Error Inner: " + vectorInners[_innerActual].Numero.ToString(CultureInfo.InvariantCulture) + " Conf Automatica on-off");
                            vectorInners[_innerActual].CountFails++;
                            if (vectorInners[_innerActual].CountFails > 5)
                            {
                                //vuele a estado de reconexion
                                vectorInners[_innerActual].Estado = 1;
                                break;
                            }
                        }

                        #endregion
                        break;
                    case 5:
                        #region Configuracion Online
                        AppendTextBox(textBox1, "Configuracion Online! Inner [" + vectorInners[_innerActual].Numero.ToString(CultureInfo.InvariantCulture) + "]");
                        EasyInner.ConfigurarInnerOnLine();
                        EasyInner.DefinirQuantidadeDigitosCartao((byte)qtyB);
                        //EasyInner.HabilitarTeclado(1, 0);
                        EasyInner.ConfigurarTipoLeitor((byte)Enumeradores.TipoLeitor.PROXIMIDADE_ABATRACK2);
                        EasyInner.ReceberDataHoraDadosOnLine(1);
                        Res = EasyInner.EnviarConfiguracoes(vectorInners[_innerActual].Numero);
                        if (Res == (int)Enumeradores.Retorno.RET_COMANDO_OK)
                        {
                            AppendTextBox(textBox1, "Inner: " + vectorInners[_innerActual].Numero.ToString(CultureInfo.InvariantCulture) + " conf Online OK");
                            vectorInners[_innerActual].Estado = 6;
                        }
                        else
                        {
                            AppendTextBox(textBox1, "Inner: " + vectorInners[_innerActual].Numero.ToString() + " conf Online FAIL");
                            vectorInners[_innerActual].CountFails++;
                            if (vectorInners[_innerActual].CountFails > 5)
                            {
                                //vuele a estado de reconexion
                                vectorInners[_innerActual].Estado = 1;
                                break;
                            }
                        }

                        #endregion
                        break;
                    case 6:
                        #region Inner en linea
                        AppendTextBox(textBox1, "Estado en linea! inner [" + vectorInners[_innerActual].Numero.ToString(CultureInfo.InvariantCulture) + "]");
                        Res = EasyInner.EnviarMensagemPadraoOnLine(vectorInners[_innerActual].Numero, 1, "   *En Linea*   ");
                        if (Res == (int)Enumeradores.Retorno.RET_COMANDO_OK)
                        {
                            //AppendTextBox(textBox1,"Inner: " + InnerActual.ToString() + " msg online OK");
                            vectorInners[_innerActual].Estado = 7;
                        }
                        else
                        {
                            AppendTextBox(textBox1, "Inner: " + vectorInners[_innerActual].Numero.ToString(CultureInfo.InvariantCulture) + " msg online FAIL");
                            vectorInners[_innerActual].CountFails++;
                            if (vectorInners[_innerActual].CountFails > 5)
                            {
                                //vuele a estado de reconexion
                                vectorInners[_innerActual].Estado = 1;
                                break;
                            }
                        }

                        #endregion
                        break;
                    case 7:
                        #region Conf entrada en linea
                        if (vectorInners[_innerActual].paso == false)
                        {
                            vectorInners[_innerActual].paso = true;
                            AppendTextBox(textBox1, "Conf Entradas en linea! Inner [" + 
                                vectorInners[_innerActual].Numero.ToString(CultureInfo.InvariantCulture) + "]");
                        }

                        Res = EasyInner.EnviarFormasEntradasOnLine(
                        vectorInners[_innerActual].Numero,      //Numero do Inner..
                        (byte)qtyB,  //Qtd Digitos Teclado..
                        0,                      //Eco do Teclado no Display..
                        (byte)Enumeradores.EntradasMudancaOnline.ACEITA_LEITURA_LEITOR1,  //TECLADO_E_LEITOR1_E_VERI_BIOMETRICA,//Teclado + Leitor 1 + Verificação Biométrica..
                        15,                     //Tempo teclado..
                        17);                    //Posição do Cursor no Teclado..
                        if (Res == (int)Enumeradores.Retorno.RET_COMANDO_OK)
                        {
                            // AppendTextBox(textBox1,"Inner: " + InnerActual.ToString() + " Conf Entrada online OK");
                            vectorInners[_innerActual].Estado = 8;
                        }
                        else
                        {
                            AppendTextBox(textBox1, "Inner: " + vectorInners[_innerActual].Numero.ToString(CultureInfo.InvariantCulture) + " Conf Entrada online FAIL");
                            vectorInners[_innerActual].CountFails++;
                            if (vectorInners[_innerActual].CountFails > 5)
                            {
                                //vuele a estado de reconexion
                                vectorInners[_innerActual].Estado = 1;
                                break;
                            }
                        }
                        //Estado = 9;
                        #endregion
                        break;
                    case 8:
                        #region espera la lectura de Tarjeta
                        if (vectorInners[_innerActual].PasoTarjeta == false)
                        {
                            AppendTextBox(textBox1, "Esperando Tarjeta! inner [" + vectorInners[_innerActual].Numero.ToString(CultureInfo.InvariantCulture) + "]");
                            vectorInners[_innerActual].PasoTarjeta = true;
                        }


                        Cartao = new StringBuilder();
                        Res = EasyInner.ReceberDadosOnLine(vectorInners[_innerActual].Numero, ref Origem, ref Complemento,
                            Cartao, ref Dia, ref Mes, ref Ano, ref Hora, ref Minuto, ref Segundo);
                        if (Res == (int)Enumeradores.Retorno.RET_COMANDO_OK)
                        {

                            strCartao = "";
                            vectorInners[_innerActual].PasoTarjeta = false;

                            for (var Count = 0; Count < qtyB; Count++)
                            {
                                strCartao += System.Convert.ToString(System.Convert.ToChar(Cartao[Count]));
                            }

                            strCartao = string.Format("{0:X}", Convert.ToInt64(strCartao));
                            strCartao = strCartao.ToLower();
                            AppendTextBox(textBox1, "Datos en linea Inner: " +
                                     vectorInners[_innerActual].Numero.ToString() + " \r\n" +
                                     "Origen: " + Origem.ToString() + " \r\n" +
                                     "Complemento: " + Complemento.ToString() + " \r\n" +
                                     " CR: " + strCartao + " \r\nData: " +
                                     Dia.ToString() + "/" +
                                     Mes.ToString() + "/" +
                                     Ano.ToString() + " " +
                                     Hora.ToString() + ":" +
                                     Minuto.ToString() + ":" +
                                     Segundo.ToString());

                            //x: comparar contra la lista de la base de datos de control de acceso 
                            Empleados em = new Empleados();
                            string nombres = "";
                            if (VerificaTarjeta(strCartao) == true)
                            {
                                
                                //**********************************tiene permiso
                                if (EasyInner.AcionarBipCurto(vectorInners[_innerActual].Numero) == (int)Enumeradores.Retorno.RET_COMANDO_OK)
                                {
                                    vectorInners[_innerActual].CARTAOB = strCartao;
                                    //res = EasyInner.EnviarMensagemPadraoOnLine(InnerAtual, 1, "Por favor Pase");
                                    
                                    try
                                    {
                                        nombres = em.consultarXtarjeta(strCartao).nombre;
                                        nombres = nombres.Remove(15);
                                    }
                                    catch (Exception)
                                    {
                                        
                                        
                                    }
                                    Res = EasyInner.EnviarMensagemPadraoOnLine(vectorInners[_innerActual].Numero, (byte)Enumeradores.Opcao.NAO,
                                        "" + nombres + "" +
                                        "         Siga        ");
                                    if (Res == (int)Enumeradores.Retorno.RET_COMANDO_OK)
                                    {
                                        vectorInners[_innerActual].TimerMsgOnline = DateTime.Now;
                                        vectorInners[_innerActual].renewMsgOnline = true;
                                        if (vectorInners[_innerActual].isInnerNet == true)
                                        {
                                            EasyInner.AcionarRele2(vectorInners[_innerActual].Numero);
                                        }
                                        else
                                        {
                                            EasyInner.LiberarCatracaDoisSentidos(vectorInners[_innerActual].Numero);
                                        }
                                        //se debe cambiar de estado a verificar el paso
                                        //si es innernet no hay necesidad
                                        if (vectorInners[_innerActual].isInnerNet == true)
                                        {
                                            vectorInners[_innerActual].Estado = 9;
                                            PersisteMarcacion(vectorInners[_innerActual].CARTAOB, vectorInners[_innerActual].Numero.ToString(CultureInfo.InvariantCulture));
                                        }
                                        else
                                        {
                                            //no verifica el paso por tranca
                                            vectorInners[_innerActual].TimerAccess = DateTime.Now;
                                            vectorInners[_innerActual].Estado = 12;
                                        }

                                    }

                                }
                            }
                            else
                            {
                                //**************************************no tiene permiso
                                Res = EasyInner.EnviarMensagemPadraoOnLine(vectorInners[_innerActual].Numero, (byte)Enumeradores.Opcao.NAO,
                                        "      Acceso     " +
                                        "     negado!     ");
                                if (Res == (int)Enumeradores.Retorno.RET_COMANDO_OK)
                                {
                                    Res = EasyInner.AcionarBipLongo(vectorInners[_innerActual].Numero);
                                    vectorInners[_innerActual].isMsgNeg = true;
                                    vectorInners[_innerActual].TimerMsgNeg = DateTime.Now;
                                    vectorInners[_innerActual].Estado = 9;
                                    //falta cambiar el msg otravez
                                }
                            }


                        }
                        else
                        {
                            vectorInners[_innerActual].Estado = 9;
                        }
                        #endregion
                        break;
                    case 9:
                        //verifica el ping
                        #region ping verify

                        t3 = DateTime.Now - vectorInners[_innerActual].TimerPingOnline;
                        if (t3.Seconds >= 3)
                        {
                            vectorInners[_innerActual].TimerPingOnline = DateTime.Now;
                            //realizo ping
                            Res = EasyInner.PingOnLine(vectorInners[_innerActual].Numero);
                            if (Res == (int)Enumeradores.Retorno.RET_COMANDO_OK)
                            {
                                vectorInners[_innerActual].Estado = 36;
                            }
                            else
                            {
                                vectorInners[_innerActual].Estado = 1;
                                break;
                            }
                        }
                        else
                        {
                            t3 = DateTime.Now - vectorInners[_innerActual].TimerMsgNeg;
                            if (vectorInners[_innerActual].isMsgNeg == true && t3.Seconds > 1)
                            {
                                vectorInners[_innerActual].isMsgNeg = false;
                                EasyInner.EnviarMensagemPadraoOnLine(vectorInners[_innerActual].Numero, 1, "   *En Linea*   ");
                                vectorInners[_innerActual].Estado = 36;
                            }
                            else
                            {
                                t3 = DateTime.Now - vectorInners[_innerActual].TimerMsgOnline;
                                if (vectorInners[_innerActual].renewMsgOnline == true && t3.Seconds > 2)
                                {
                                    vectorInners[_innerActual].renewMsgOnline = false;
                                    EasyInner.EnviarMensagemPadraoOnLine(vectorInners[_innerActual].Numero, 1, "   *En Linea*   ");
                                    vectorInners[_innerActual].Estado = 36;
                                }
                                else
                                {
                                    vectorInners[_innerActual].Estado = 8;
                                }

                            }

                        }
                        #endregion
                        //Thread.Sleep(20);
                        break;
                    case 12:
                        //paso por l tranca
                        #region verificar el giro del molinete
                        if (vectorInners[_innerActual].PasoMSGmolinete == false)
                        {
                            AppendTextBox(textBox1, "Verificando Giro del Molinete! inner[" + vectorInners[_innerActual].Numero.ToString(CultureInfo.InvariantCulture) + "]");
                            vectorInners[_innerActual].PasoMSGmolinete = true;
                        }

                        //verificar  el giro del molinete

                        Res = EasyInner.ReceberDadosOnLine(vectorInners[_innerActual].Numero, ref Origem, ref Complemento,
                            Cartao, ref Dia, ref Mes, ref Ano, ref Hora, ref Minuto, ref Segundo);
                        if (Res == (int)Enumeradores.Retorno.RET_COMANDO_OK)
                        {
                            if (Origem == (int)Enumeradores.Origem.FIM_TEMPO_ACIONAMENTO)
                            {
                                //UiMainOnline.lblDados.Text = "Não girou a catraca!";
                                AppendTextBox(textBox1, "No ha girado el Molinete!");
                                EasyInner.EnviarMensagemPadraoOnLine(vectorInners[_innerActual].Numero, 1, "   *En Linea*   ");
                                vectorInners[_innerActual].PasoMSGmolinete = false;
                                vectorInners[_innerActual].Estado = 9;
                            }
                            else if (Origem == (int)Enumeradores.Origem.GIRO_DA_CATRACA_TOPDATA)
                            {
                                //UiMainOnline.lblDados.Text = "Girou a catraca!";
                                EasyInner.EnviarMensagemPadraoOnLine(vectorInners[_innerActual].Numero, 1, "   *En Linea*   ");
                                AppendTextBox(textBox1, "Paso el molinete!");
                                PersisteMarcacion(vectorInners[_innerActual].CARTAOB, vectorInners[_innerActual].Numero.ToString(CultureInfo.InvariantCulture));
                                vectorInners[_innerActual].PasoMSGmolinete = false;
                                vectorInners[_innerActual].Estado = 9;
                            }
                        }
                        else
                        {
                            t3 = DateTime.Now - vectorInners[_innerActual].TimerAccess;
                            if (t3.Seconds > 8)
                            {
                                AppendTextBox(textBox1, "Se vencio el tiempo de acceso! inner [" + vectorInners[_innerActual].Numero.ToString(CultureInfo.InvariantCulture) + "]");
                                EasyInner.EnviarMensagemPadraoOnLine(vectorInners[_innerActual].Numero, 1, "   *En Linea*   ");
                                vectorInners[_innerActual].PasoMSGmolinete = false;
                                vectorInners[_innerActual].Estado = 9;
                            }

                        }
                        #endregion
                        break;

                    case 36:
                        //verifica la exist any tarea para el inner selecionado
                        var tarea = tareaIn.ObtenerUltimaTarea(vectorInners[_innerActual].Numero);
                        if (tarea != null)
                        {
                            switch (tarea.CodigoAccion.Trim())
                            {
                                case "OpenS":
                                    //efectua la paretura de la puerta 
                                    EasyInner.AcionarRele2(vectorInners[_innerActual].Numero);
                                    tareaIn.CumplirTarea(tarea);
                                    AppendTextBox(textBox1, "Activando salida del Parquedero de forma manual");
                                    break;
                            }
                        }
                        
                        vectorInners[_innerActual].Estado = 7;
                        break;
                }

                #region [20. Proceso General Incrementa Inner]

                //changeProgress();
                _innerActual++;
                if (_innerActual > vectorInners.Count-1)
                {
                    _innerActual = 0;
                }
                #region [0. Proceso General] se para en el primer inner activo

                while (true)
                {
                    if (vectorInners[_innerActual].isActive == true)
                    {
                        break;
                    }
                    else
                    {
                        _innerActual++;
                        if (_innerActual > vectorInners.Count - 1)
                        {
                            _innerActual = 0;
                        }
                    }
                }
                #endregion
                #endregion

                Application.DoEvents();
            }
            salir = true;
            AppendTextBox(textBox1, "Proceso Finalizado!");
        }

        public bool VerificaTarjeta(string card)
        {
            int res;
            bool ret = false;

            //TODO:Aqui se debe hacer la verificacin contra la db para los persmisos de una tarjeta
            Vtarjetas vt = new Vtarjetas();
            ret = vt.VerificaTarjetaBussiness(card);
            
            
            return ret;
        }

        public void PersisteMarcacion(string card, string inerN)
        {
            Vtarjetas vt = new Vtarjetas();
            vt.GuardaMarcacionTarjeta(card, inerN );
        }

        private void frmInnerRuntime_FormClosing(object sender, FormClosingEventArgs e)
        {
            _termino = true;
            try
            {
                molinete1.Interrupt();
                molinete1.Join(2500);
                molinete1.Abort(); 
                _termino = true;
            }
            catch (Exception)
            {
                
                
            }
            while (!salir)
            {
                _termino = true;
                Application.DoEvents();
            }

        }

        private void tmrInicio_Tick(object sender, EventArgs e)
        {
            tmrInicio.Enabled = false;
            Inners molinetesL = new Inners();
            List<Tinner> lista = molinetesL.listarTodos();
            //radTreeView1.DataSource = lista;
            //radTreeView1.DisplayMember = "NombreInner";
            //radTreeView1.ValueMember = "CodeInner";
            //llenar lista de clases de inners

            foreach (var a in lista)
            {
                var tmp = new Inner()
                {
                    Numero = (int)a.CodeInner,
                    nombre = a.NombreInner.ToString(CultureInfo.InvariantCulture),
                    nombre2 = a.NombreInner.ToString(CultureInfo.InvariantCulture) + " Fuera de Linea",
                    isActive = a.esActivo != null && (bool)a.esActivo,
                    isInnerNet = a.esinnerNet != null && (bool)a.esinnerNet,
                    PuertoTCP = (int)a.puertoCom,
                    Estado = 1,
                    sm = "|"
                };
                vectorInners.Add(tmp);

            }
            radTreeView1.DataSource = vectorInners;
            radTreeView1.DisplayMember = "nombre2";
            radTreeView1.ValueMember = "Numero";
            rfRadtre();
            int res = 0;

            //se crea el hilo de atencion al los inners 
            _termino = false;
            molinete1 = new Thread(new ThreadStart(ProcesoInners));
            molinete1.Start();
            
        }
    }
}
